package main

import (
	"crypto/tls"
	"fmt"
	"github.com/go-resty/resty/v2"
	"net"
	"net/http"
	"net/url"
	"time"
)

type proxyNode struct {
	Ip       string `json:"ip"`
	Port     string `json:"port"`
	Username string `json:"username"`
	Password string `json:"password"`
	Expr     int64  `json:"expr"`
}

/*
1. proxyconnect tcp: dial tcp 8.209.212.212:10012: i/o timeout 是 连接代理超时，设置 http.Transport.DialContext.Timeout 的超时时间就行了

2. context deadline exceeded (Client.Timeout exceeded while awaiting headers) 是连接目标主机的超时，设置 c.httpClient.Timeout 的超时时间就行

 3. http.Client.Timeout 字段，指的是整个请求的总超时时间，包括连接建立、发送请求、等待响应、读取响应等各个阶段的时间。它是一个综合性的超时设置，涵盖了整个请求的生命周期。
    具体来说，Timeout 字段的设置会影响以下几个方面：

1. 连接建立时间：在发送请求前，需要和目标服务器（或代理服务器）建立连接。如果连接建立的时间超过了设置的 Timeout，那么整个请求会被视为超时。

2. 发送请求时间：一旦连接建立成功，HTTP 客户端会发送请求（包括请求头和请求主体）。这个时间也计入了整个超时时间。

3. 等待响应时间：客户端会等待目标服务器的响应。如果在设置的 Timeout 内没有收到响应，请求会被视为超时。

 4. 读取响应时间：一旦客户端开始读取服务器的响应数据，这个时间同样计入了整个超时时间。
    总之，Timeout 字段用于控制整个请求的最长处理时间，包括连接建立、请求发送、等待响应和读取响应等各个阶段。如果在这个时间内任何一个阶段超过了设定的超时时间，整个请求会被视为超时并可能被中止。
*/
func main() {

	n := &net.Dialer{
		//Timeout: time.Second * 3,
	}
	p := proxyNode{
		Ip:       "8.209.212.212",
		Port:     "10012",
		Username: "397e93dbd3a64c10abc4cca37d9f47e4",
		Password: "4TeYO8SE",
	}
	for {
		transport := &http.Transport{
			//ResponseHeaderTimeout: time.Second * 3,
			DialContext:           n.DialContext,
			IdleConnTimeout:       time.Second * 3,
			ExpectContinueTimeout: time.Second * 3,
			TLSHandshakeTimeout:   time.Second * 3,
			MaxIdleConns:          5,
			MaxConnsPerHost:       5,
			MaxIdleConnsPerHost:   5,
			DisableKeepAlives:     true,
			TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},
			Proxy: func() func(*http.Request) (*url.URL, error) {
				data := fmt.Sprintf("socks5://%s:%s@%s", p.Username, p.Password, fmt.Sprintf("%s:%v", p.Ip, p.Port))
				proxyUrl, _ := url.Parse(data)
				return http.ProxyURL(proxyUrl)
			}(),
		}
		client := resty.New().
			SetTransport(transport).
			SetTimeout(time.Second * 5).
			R()
		//resp, err := client.Get("https://www.google.com")
		resp, err := client.Post("https://api.twitter.com/1.1/onboarding/task.json")
		if err != nil {
			fmt.Println(err)
		}

		fmt.Println("消耗时间:", resp.Time(), "接收时间:", resp.ReceivedAt(), "发送时间:", resp.Request.Time)

		time.Sleep(time.Second)
	}
}
